/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package logicanegocio;

import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import entities.Equipo;
import entities.Tarjeta;
import java.util.ArrayList;
import java.util.List;
import entities.Anotacion;
import entities.Jugador;
import entities.JugadorXPartido;
import java.math.BigDecimal;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import logicanegocio.exceptions.IllegalOrphanException;
import logicanegocio.exceptions.NonexistentEntityException;
import logicanegocio.exceptions.PreexistingEntityException;

/**
 *
 * @author Alejandro
 */
public class JugadorJpaController implements Serializable {

    public JugadorJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Jugador jugador) throws PreexistingEntityException, Exception {
        if (jugador.getTarjetaList() == null) {
            jugador.setTarjetaList(new ArrayList<Tarjeta>());
        }
        if (jugador.getAnotacionList() == null) {
            jugador.setAnotacionList(new ArrayList<Anotacion>());
        }
        if (jugador.getJugadorXPartidoList() == null) {
            jugador.setJugadorXPartidoList(new ArrayList<JugadorXPartido>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Equipo equipoIdEquipo = jugador.getEquipoIdEquipo();
            if (equipoIdEquipo != null) {
                equipoIdEquipo = em.getReference(equipoIdEquipo.getClass(), equipoIdEquipo.getIdEquipo());
                jugador.setEquipoIdEquipo(equipoIdEquipo);
            }
            List<Tarjeta> attachedTarjetaList = new ArrayList<Tarjeta>();
            for (Tarjeta tarjetaListTarjetaToAttach : jugador.getTarjetaList()) {
                tarjetaListTarjetaToAttach = em.getReference(tarjetaListTarjetaToAttach.getClass(), tarjetaListTarjetaToAttach.getIdEvento());
                attachedTarjetaList.add(tarjetaListTarjetaToAttach);
            }
            jugador.setTarjetaList(attachedTarjetaList);
            List<Anotacion> attachedAnotacionList = new ArrayList<Anotacion>();
            for (Anotacion anotacionListAnotacionToAttach : jugador.getAnotacionList()) {
                anotacionListAnotacionToAttach = em.getReference(anotacionListAnotacionToAttach.getClass(), anotacionListAnotacionToAttach.getIdEvento());
                attachedAnotacionList.add(anotacionListAnotacionToAttach);
            }
            jugador.setAnotacionList(attachedAnotacionList);
            List<JugadorXPartido> attachedJugadorXPartidoList = new ArrayList<JugadorXPartido>();
            for (JugadorXPartido jugadorXPartidoListJugadorXPartidoToAttach : jugador.getJugadorXPartidoList()) {
                jugadorXPartidoListJugadorXPartidoToAttach = em.getReference(jugadorXPartidoListJugadorXPartidoToAttach.getClass(), jugadorXPartidoListJugadorXPartidoToAttach.getJugadorXPartidoPK());
                attachedJugadorXPartidoList.add(jugadorXPartidoListJugadorXPartidoToAttach);
            }
            jugador.setJugadorXPartidoList(attachedJugadorXPartidoList);
            em.persist(jugador);
            if (equipoIdEquipo != null) {
                equipoIdEquipo.getJugadorList().add(jugador);
                equipoIdEquipo = em.merge(equipoIdEquipo);
            }
            for (Tarjeta tarjetaListTarjeta : jugador.getTarjetaList()) {
                Jugador oldJugadorIdJugadorOfTarjetaListTarjeta = tarjetaListTarjeta.getJugadorIdJugador();
                tarjetaListTarjeta.setJugadorIdJugador(jugador);
                tarjetaListTarjeta = em.merge(tarjetaListTarjeta);
                if (oldJugadorIdJugadorOfTarjetaListTarjeta != null) {
                    oldJugadorIdJugadorOfTarjetaListTarjeta.getTarjetaList().remove(tarjetaListTarjeta);
                    oldJugadorIdJugadorOfTarjetaListTarjeta = em.merge(oldJugadorIdJugadorOfTarjetaListTarjeta);
                }
            }
            for (Anotacion anotacionListAnotacion : jugador.getAnotacionList()) {
                Jugador oldJugadorIdJugadorOfAnotacionListAnotacion = anotacionListAnotacion.getJugadorIdJugador();
                anotacionListAnotacion.setJugadorIdJugador(jugador);
                anotacionListAnotacion = em.merge(anotacionListAnotacion);
                if (oldJugadorIdJugadorOfAnotacionListAnotacion != null) {
                    oldJugadorIdJugadorOfAnotacionListAnotacion.getAnotacionList().remove(anotacionListAnotacion);
                    oldJugadorIdJugadorOfAnotacionListAnotacion = em.merge(oldJugadorIdJugadorOfAnotacionListAnotacion);
                }
            }
            for (JugadorXPartido jugadorXPartidoListJugadorXPartido : jugador.getJugadorXPartidoList()) {
                Jugador oldJugadorOfJugadorXPartidoListJugadorXPartido = jugadorXPartidoListJugadorXPartido.getJugador();
                jugadorXPartidoListJugadorXPartido.setJugador(jugador);
                jugadorXPartidoListJugadorXPartido = em.merge(jugadorXPartidoListJugadorXPartido);
                if (oldJugadorOfJugadorXPartidoListJugadorXPartido != null) {
                    oldJugadorOfJugadorXPartidoListJugadorXPartido.getJugadorXPartidoList().remove(jugadorXPartidoListJugadorXPartido);
                    oldJugadorOfJugadorXPartidoListJugadorXPartido = em.merge(oldJugadorOfJugadorXPartidoListJugadorXPartido);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findJugador(jugador.getIdJugador()) != null) {
                throw new PreexistingEntityException("Jugador " + jugador + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Jugador jugador) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Jugador persistentJugador = em.find(Jugador.class, jugador.getIdJugador());
            Equipo equipoIdEquipoOld = persistentJugador.getEquipoIdEquipo();
            Equipo equipoIdEquipoNew = jugador.getEquipoIdEquipo();
            List<Tarjeta> tarjetaListOld = persistentJugador.getTarjetaList();
            List<Tarjeta> tarjetaListNew = jugador.getTarjetaList();
            List<Anotacion> anotacionListOld = persistentJugador.getAnotacionList();
            List<Anotacion> anotacionListNew = jugador.getAnotacionList();
            List<JugadorXPartido> jugadorXPartidoListOld = persistentJugador.getJugadorXPartidoList();
            List<JugadorXPartido> jugadorXPartidoListNew = jugador.getJugadorXPartidoList();
            List<String> illegalOrphanMessages = null;
            for (JugadorXPartido jugadorXPartidoListOldJugadorXPartido : jugadorXPartidoListOld) {
                if (!jugadorXPartidoListNew.contains(jugadorXPartidoListOldJugadorXPartido)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain JugadorXPartido " + jugadorXPartidoListOldJugadorXPartido + " since its jugador field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (equipoIdEquipoNew != null) {
                equipoIdEquipoNew = em.getReference(equipoIdEquipoNew.getClass(), equipoIdEquipoNew.getIdEquipo());
                jugador.setEquipoIdEquipo(equipoIdEquipoNew);
            }
            List<Tarjeta> attachedTarjetaListNew = new ArrayList<Tarjeta>();
            for (Tarjeta tarjetaListNewTarjetaToAttach : tarjetaListNew) {
                tarjetaListNewTarjetaToAttach = em.getReference(tarjetaListNewTarjetaToAttach.getClass(), tarjetaListNewTarjetaToAttach.getIdEvento());
                attachedTarjetaListNew.add(tarjetaListNewTarjetaToAttach);
            }
            tarjetaListNew = attachedTarjetaListNew;
            jugador.setTarjetaList(tarjetaListNew);
            List<Anotacion> attachedAnotacionListNew = new ArrayList<Anotacion>();
            for (Anotacion anotacionListNewAnotacionToAttach : anotacionListNew) {
                anotacionListNewAnotacionToAttach = em.getReference(anotacionListNewAnotacionToAttach.getClass(), anotacionListNewAnotacionToAttach.getIdEvento());
                attachedAnotacionListNew.add(anotacionListNewAnotacionToAttach);
            }
            anotacionListNew = attachedAnotacionListNew;
            jugador.setAnotacionList(anotacionListNew);
            List<JugadorXPartido> attachedJugadorXPartidoListNew = new ArrayList<JugadorXPartido>();
            for (JugadorXPartido jugadorXPartidoListNewJugadorXPartidoToAttach : jugadorXPartidoListNew) {
                jugadorXPartidoListNewJugadorXPartidoToAttach = em.getReference(jugadorXPartidoListNewJugadorXPartidoToAttach.getClass(), jugadorXPartidoListNewJugadorXPartidoToAttach.getJugadorXPartidoPK());
                attachedJugadorXPartidoListNew.add(jugadorXPartidoListNewJugadorXPartidoToAttach);
            }
            jugadorXPartidoListNew = attachedJugadorXPartidoListNew;
            jugador.setJugadorXPartidoList(jugadorXPartidoListNew);
            jugador = em.merge(jugador);
            if (equipoIdEquipoOld != null && !equipoIdEquipoOld.equals(equipoIdEquipoNew)) {
                equipoIdEquipoOld.getJugadorList().remove(jugador);
                equipoIdEquipoOld = em.merge(equipoIdEquipoOld);
            }
            if (equipoIdEquipoNew != null && !equipoIdEquipoNew.equals(equipoIdEquipoOld)) {
                equipoIdEquipoNew.getJugadorList().add(jugador);
                equipoIdEquipoNew = em.merge(equipoIdEquipoNew);
            }
            for (Tarjeta tarjetaListOldTarjeta : tarjetaListOld) {
                if (!tarjetaListNew.contains(tarjetaListOldTarjeta)) {
                    tarjetaListOldTarjeta.setJugadorIdJugador(null);
                    tarjetaListOldTarjeta = em.merge(tarjetaListOldTarjeta);
                }
            }
            for (Tarjeta tarjetaListNewTarjeta : tarjetaListNew) {
                if (!tarjetaListOld.contains(tarjetaListNewTarjeta)) {
                    Jugador oldJugadorIdJugadorOfTarjetaListNewTarjeta = tarjetaListNewTarjeta.getJugadorIdJugador();
                    tarjetaListNewTarjeta.setJugadorIdJugador(jugador);
                    tarjetaListNewTarjeta = em.merge(tarjetaListNewTarjeta);
                    if (oldJugadorIdJugadorOfTarjetaListNewTarjeta != null && !oldJugadorIdJugadorOfTarjetaListNewTarjeta.equals(jugador)) {
                        oldJugadorIdJugadorOfTarjetaListNewTarjeta.getTarjetaList().remove(tarjetaListNewTarjeta);
                        oldJugadorIdJugadorOfTarjetaListNewTarjeta = em.merge(oldJugadorIdJugadorOfTarjetaListNewTarjeta);
                    }
                }
            }
            for (Anotacion anotacionListOldAnotacion : anotacionListOld) {
                if (!anotacionListNew.contains(anotacionListOldAnotacion)) {
                    anotacionListOldAnotacion.setJugadorIdJugador(null);
                    anotacionListOldAnotacion = em.merge(anotacionListOldAnotacion);
                }
            }
            for (Anotacion anotacionListNewAnotacion : anotacionListNew) {
                if (!anotacionListOld.contains(anotacionListNewAnotacion)) {
                    Jugador oldJugadorIdJugadorOfAnotacionListNewAnotacion = anotacionListNewAnotacion.getJugadorIdJugador();
                    anotacionListNewAnotacion.setJugadorIdJugador(jugador);
                    anotacionListNewAnotacion = em.merge(anotacionListNewAnotacion);
                    if (oldJugadorIdJugadorOfAnotacionListNewAnotacion != null && !oldJugadorIdJugadorOfAnotacionListNewAnotacion.equals(jugador)) {
                        oldJugadorIdJugadorOfAnotacionListNewAnotacion.getAnotacionList().remove(anotacionListNewAnotacion);
                        oldJugadorIdJugadorOfAnotacionListNewAnotacion = em.merge(oldJugadorIdJugadorOfAnotacionListNewAnotacion);
                    }
                }
            }
            for (JugadorXPartido jugadorXPartidoListNewJugadorXPartido : jugadorXPartidoListNew) {
                if (!jugadorXPartidoListOld.contains(jugadorXPartidoListNewJugadorXPartido)) {
                    Jugador oldJugadorOfJugadorXPartidoListNewJugadorXPartido = jugadorXPartidoListNewJugadorXPartido.getJugador();
                    jugadorXPartidoListNewJugadorXPartido.setJugador(jugador);
                    jugadorXPartidoListNewJugadorXPartido = em.merge(jugadorXPartidoListNewJugadorXPartido);
                    if (oldJugadorOfJugadorXPartidoListNewJugadorXPartido != null && !oldJugadorOfJugadorXPartidoListNewJugadorXPartido.equals(jugador)) {
                        oldJugadorOfJugadorXPartidoListNewJugadorXPartido.getJugadorXPartidoList().remove(jugadorXPartidoListNewJugadorXPartido);
                        oldJugadorOfJugadorXPartidoListNewJugadorXPartido = em.merge(oldJugadorOfJugadorXPartidoListNewJugadorXPartido);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                BigDecimal id = jugador.getIdJugador();
                if (findJugador(id) == null) {
                    throw new NonexistentEntityException("The jugador with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(BigDecimal id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Jugador jugador;
            try {
                jugador = em.getReference(Jugador.class, id);
                jugador.getIdJugador();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The jugador with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<JugadorXPartido> jugadorXPartidoListOrphanCheck = jugador.getJugadorXPartidoList();
            for (JugadorXPartido jugadorXPartidoListOrphanCheckJugadorXPartido : jugadorXPartidoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Jugador (" + jugador + ") cannot be destroyed since the JugadorXPartido " + jugadorXPartidoListOrphanCheckJugadorXPartido + " in its jugadorXPartidoList field has a non-nullable jugador field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Equipo equipoIdEquipo = jugador.getEquipoIdEquipo();
            if (equipoIdEquipo != null) {
                equipoIdEquipo.getJugadorList().remove(jugador);
                equipoIdEquipo = em.merge(equipoIdEquipo);
            }
            List<Tarjeta> tarjetaList = jugador.getTarjetaList();
            for (Tarjeta tarjetaListTarjeta : tarjetaList) {
                tarjetaListTarjeta.setJugadorIdJugador(null);
                tarjetaListTarjeta = em.merge(tarjetaListTarjeta);
            }
            List<Anotacion> anotacionList = jugador.getAnotacionList();
            for (Anotacion anotacionListAnotacion : anotacionList) {
                anotacionListAnotacion.setJugadorIdJugador(null);
                anotacionListAnotacion = em.merge(anotacionListAnotacion);
            }
            em.remove(jugador);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Jugador> findJugadorEntities() {
        return findJugadorEntities(true, -1, -1);
    }

    public List<Jugador> findJugadorEntities(int maxResults, int firstResult) {
        return findJugadorEntities(false, maxResults, firstResult);
    }

    private List<Jugador> findJugadorEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Jugador.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Jugador findJugador(BigDecimal id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Jugador.class, id);
        } finally {
            em.close();
        }
    }

    public int getJugadorCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Jugador> rt = cq.from(Jugador.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
